package cn.lingyangwl.agile.model.module.auth;

import cn.lingyangwl.agile.model.enums.*;
import cn.lingyangwl.framework.tool.core.StringUtils;
import cn.lingyangwl.framework.tool.core.exception.BizException;
import com.alibaba.fastjson2.JSON;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;

import java.io.Serializable;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 用户信息
 *
 * @author shenguangyang
 */
@Slf4j
@Getter
@Setter
@Accessors(chain = true)
public class LoginUser implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 用户名id
     */
    @JsonSerialize(using = ToStringSerializer.class)
    private Long userId;

    /**
     * 用户登录id
     */
    private String loginId;

    /**
     * 登录的客户端id
     */
    private String clientId;

    /**
     * 登录用户名/手机号/邮箱/openId等等
     */
    private String userName;

    /**
     * 应用类型
     * @see cn.lingyangwl.agile.model.constants.AppType
     */
    private String appType;

    /**
     * 用户账号(返回给前端要做脱敏处理)
     */
    private UserAccount account = new UserAccount();

    /**
     * 登录第三方平台的openId
     */
    private String openId;

    /**
     * 授权类型
     * @see GrantTypeEnum
     */
    private String grantType;

    /**
     * 用户状态
     */
    private String status;

    /**
     * 登录时间
     */
    private Long loginTime;

    /**
     * 登录IP地址
     */
    private String loginIp;

    /**
     * 登录地点
     */
    private String loginLocation;

    /**
     * 浏览器类型
     */
    private String browser;

    /**
     * 操作系统
     */
    private String os;

    /**
     * 是否为租户拥有者, 该值会在网关动态识别租户并被填充
     */
    private Boolean isTenantOwner = Boolean.FALSE;

    /**
     * 终端(来源)
     * @see TerminalEnum
     */
    private String terminal;

    /**
     * 用户选择的当前部门id
     */
    private Long currentDeptId;

    /**
     * 用户当前租户信息
     */
    private AuthUserTenant tenant;

    /**
     * 拥有的租户id列表
     */
    private Set<String> owningTenantIds = Collections.emptySet();

    /**
     * 扩展参数
     */
    private Map<String, Object> extParams = new HashMap<>();


    public void checkTenant(String tenantId) {
//        // 如果来自移动端, 暂时不校验租户是否越权
//        if (AppType.APP.getCode().equals(this.getAppType())) {
//            return;
//        }
        if (!owningTenantIds.contains(tenantId)) {
            throw new BizException("租户越权");
        }
    }

    public String encodeToString() {
        String json = JSON.toJSONString(this);
        try {
            return URLEncoder.encode(json, "UTF-8");
        } catch (Exception e) {
            log.error("error: ", e);
        }
        return json;
    }

    public static LoginUser decode(String encodedStr) {
        try {
            if (StringUtils.isEmpty(encodedStr)) {
                return null;
            }
            return JSON.parseObject(URLDecoder.decode(encodedStr, "UTF-8"), LoginUser.class);
        } catch (Exception e) {
            log.error("error: {}, encodedStr: {}", e.getMessage(), encodedStr);
            throw new BizException("解析用户信息失败");
        }
    }
}
